<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for March, 2017</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for March, 2017</h1>
<p><a id="p0"></a></p>
<div class="date">17年3月18日 周六 10:43</div>
<h2>Git 二三事</h2>
<p>之前公司一直在用 svn，虽然我也有用 github，但并没有真正参与过多人开发的
情况，分布式的 git 在多人开发方面与 svn 有很多不同。</p>
<p>git 是完全并行的开发，意味着提交的时候，origin 远端只是看对应文件能否
merge，不不冲突的话就直接接受了。可是如果我们看版本线，会有这样的情况，
本地刚提交的版本的上一个版本，并不是远端的末端版本，也就是说，在我们这两
次提交的中间，其他人已经有版本提交到远端了。</p>
<p>如果用 source tree 这样的工具看，可以看到本地上个版本对应的远端版本，很
可能有多条线并行出来；先提交的同学，版本线在主线上，后提交的同学，版本线
被并行出来，在最后提交的版本上合并。</p>
<p>svn 呢，因为没有分布式的概念，因此只有一条开发线。</p>
<p>为了更明晰远端库的版本线问题，每次 push 到远端前，需要在本地分支上
rebase origin 分支，其实就是先找到本地跟远端版本的公共父节点，从这个点开
始，将远端的版本合并到本地分支，再将本地分支这个公共父节点版本后的代码，
一个个 apply 上去，之后再 push 到远端，这时候就只有一条线了。</p>
<p>因此，merge 仅仅在末端版本上合并代码，而 rebase 则会找到公共父节点，重整
版本线。</p>
<p>另外一种情况，是本地再多开分支，其中一个分支用来同步远端，这个时候，本地
的另外一个分支，提交的顺序是先提交到本地同步分支，同步分支再 push 到远端。</p>
<p>这个时候，如果要保证三个分支的末端版本一致，同步分支可以先 rebase 远端，
保证末端版本与远端一致，本地分支再 rebase 本地同步分支，本地分支版本线也
与远端一致了；之后，同步分支 merge 本地分支，再 push 到远端。</p>
<p>或者也可以这样，本地同步分支先 merge 本地分支，再 pull rebase 远端，再
push 到远端。不过这个时候，这个用来并行开发的本地分支，版本线跟远端很可
能已经不一样了，这个又要怎么整呢，:)</p>
<p>坑好多呀，因为之前不明白这些，请教了组里面的一位实习生大神，才终于弄懂了。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2017-03.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- date: 2017-03-18T10:43:54+0800 -->
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>